/*
欧艾迪公司的绝对值编码器驱动程序
官网：https://oidencoder.com/

zzzhkgs
2024.03.30
*/
#include "encoder.h"
#include "main.h"
#include "bsp_can.h"






// void encoder_init(EncoderData_t *encoder)
// {
	
// }






void ReadEncoderValue(EncoderData_t *encoder)  //读取编码器值 指令0x01
{
	if (encoder==NULL) return;
	
	uint32_t send_mail_box;
	
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can_id;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can_id;
	sendText[2] = 0x01;
	sendText[3] = 0x00;

	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
	
}



void SetEncoderID(EncoderData_t *encoder,uint8_t new_id)  //设置编码器id 指令0x02
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can_id;;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can_id;;
	sendText[2] = 0x02;
	sendText[3] = new_id;
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
}



void SetCANCommunicationBaudRate(EncoderData_t *encoder, uint16_t canBaudRateMode)  //设置波特率 指令0x03
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can_id;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can_id;
	sendText[2] = 0x03;
	sendText[3] = canBaudRateMode;
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
}


void SetEncoderMode(EncoderData_t *encoder, Encoder_Return_Mode_t encoderMode)  //设置编码器模式 指令0x04
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can_id;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can_id;
	sendText[2] = 0x04;
	sendText[3] = encoderMode;
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);

}




void SetAutoFeedbackInterval(EncoderData_t *encoder, uint16_t AutoFeedbackInterval)  //设置自动回传间隔 指令0x05
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 5;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can_id;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[5];
	sendText[0] = 0x04;
	sendText[1] = encoder->can_id;
	sendText[2] = 0x05;
	sendText[3] = AutoFeedbackInterval;
	sendText[4] = (AutoFeedbackInterval>>8);
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
}

void SetEncoderZeroPoint(EncoderData_t *encoder)     //设置零点 指令0x06
{
	if (encoder==NULL) return;

	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can;
	sendText[2] = 0x06;
	sendText[3] = 0x00;
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
}


void SetEncoderRotationDirectiont(EncoderData_t *encoder, Encoder_Mode_t mode)  //设置编码器旋转方向 指令0x07
{
	if (encoder==NULL) return 0;
	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can;
	sendText[2] = 0x07;
	sendText[3] = mode;
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can, &tx_pHeader, sendText, &send_mail_box);

}




void ReadEncoderVirtualMultiTurnValue(EncoderData_t *encoder)  //读取编码器虚拟多圈值 指令0x08
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	uint32_t get_value;
	
	CAN_TxHeaderTypeDef pHeader;

	pHeader.DLC = 4;  // 数据长度，范围为0-8
	pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	pHeader.StdId = encoder->can;  // 标准标识符的值，范围为0x000-0x7FF
	pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can;
	sendText[2] = 0x08;
	sendText[3] = 0x00;

	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &pHeader, sendText, &send_mail_box);

}

void ReadEncoderVirtualTurnsValue(EncoderData_t *encoder)  //读取编码器虚拟圈数值 指令0x09
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 4;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can;
	sendText[2] = 0x09;
	sendText[3] = 0x00;
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
}



void ReadEncoderAngularVelocityValue(EncoderData_t *encoder)  //读取编码器虚拟角速度 指令0x0A
{
	if (encoder==NULL) return;
	uint32_t send_mail_box;
	uint32_t get_value;
	
	CAN_TxHeaderTypeDef pHeader;

	pHeader.DLC = 4;  // 数据长度，范围为0-8
	pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	pHeader.StdId = encoder->can;  // 标准标识符的值，范围为0x000-0x7FF
	pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[4];
	sendText[0] = 0x04;
	sendText[1] = encoder->can;
	sendText[2] = 0x0A;
	sendText[3] = 0x00;

	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &pHeader, sendText, &send_mail_box);
}




void SetEncoderAngularVelocitySamplingTime(EncoderData_t *encoder, uint16_t newVelocitySamplingTime)  //设置编码器角速度采样时间 指令0x0B
{
	if (encoder==NULL) return ;
	uint32_t send_mail_box;
	CAN_TxHeaderTypeDef tx_pHeader;

	tx_pHeader.DLC = 5;  // 数据长度，范围为0-8
	tx_pHeader.IDE = CAN_ID_STD;  // 消息标识符扩展位，CAN_ID_STD表示标准标识符
	tx_pHeader.RTR = CAN_RTR_DATA;  // 远程传输请求位，CAN_RTR_DATA表示数据帧
	tx_pHeader.StdId = encoder->can;  // 标准标识符的值，范围为0x000-0x7FF
	tx_pHeader.ExtId = 0;  // 扩展标识符的值，范围为0-0x1FFFFFFF
	tx_pHeader.TransmitGlobalTime = DISABLE;  // 是否启用传输全局时间戳，DISABLE表示禁用

	uint8_t sendText[5];
	sendText[0] = 0x04;
	sendText[1] = encoder->can;
	sendText[2] = 0x0B;
	sendText[3] = newVelocitySamplingTime;
	sendText[4] = (newVelocitySamplingTime>>8);
	
	HAL_CAN_AddTxMessage(BSP_CAN_GetHandle(encoder->can), &tx_pHeader, sendText, &send_mail_box);
}


















//CAN_HandleTypeDef hcan1;



//void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
//{
//  CAN_RxHeaderTypeDef rx_Header;
//z++;

// 
//    HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_Header, rxData);
//    // 处理接收到的数据
//    // 这里可以根据接收到的消息的ID或其他标识符来判断消息的类型，并解析数据
//		
//	//判断回传数据种类
//	if (rxData[2] == 0x01)  //编码器原始位置
//	{
//		Encoder1.EncoderValue =((uint32_t)rxData[3]) | ((uint32_t)rxData[4]<<8) | ((uint32_t)rxData[5]<<16) | ((uint32_t)rxData[6]<<24);
//		Encoder1.EncoderID = rxData[1];
//		

//	}	
//		
//	if (rxData[2] == 0x08)  //虚拟多圈值
//	{
//		Encoder1.EncoderVirtualMultiTurnValue = ((uint32_t)rxData[3]) | ((uint32_t)rxData[4]<<8) | ((uint32_t)rxData[5]<<16) | ((uint32_t)rxData[6]<<24);
//		Encoder1.EncoderID = rxData[1];
//	}		
//	
//	if (rxData[2] == 0x09)  //虚拟多圈圈数
//	{
//		Encoder1.EncoderVirtualTurnsValue = rxData[3];
//		Encoder1.EncoderID = rxData[1];
//	}
//	
//	if (rxData[2] == 0x0A)   //虚拟角速度
//	{
//		Encoder1.EncoderAngularVelocityValue = ((uint32_t)rxData[3]) | ((uint32_t)rxData[4]<<8) | ((uint32_t)rxData[5]<<16) | ((uint32_t)rxData[6]<<24);
//		Encoder1.EncoderID = rxData[1];
//	}	
//	
//	
//	Encoder1.EncoderTurns = (double)Encoder1.EncoderValue / 4096;
//	Encoder1.CumulativeAngle = Encoder1.EncoderTurns * 360;
//	
//  
//}






